Use this R Notebook document to answer the questions and document your work. Enter the R code used to answer each question in the corresponding R code chunk. Write any textual explanations outside of the chunks. Attempt to clean up your code as much as possible so that only the necessary lines remain.

When you are done:

  1. Select ‘Run All’ from the ‘Run’ dropdown menu.
  2. Save (File -> Save)
  3. Click ‘Preview’ to bring up the HW1.nb.html file. Check through this to make sure it rendered correctly.
  4. Upload the files: HW1.nb.html and HW1.Rmd to Canvas.

1 Part 1

  1. Read Hurlbert 1984 up to the section “Interspersion of treatments” .
  2. Select a paper reporting the results of an experiment.
  • Choose a paper from your field reporting on an experiment relevant to your own research.

  • A good choice might be a recent paper from your own lab (by your PI or previous grad students or postdocs) or from your own research.

  • If you cannot find a paper, come to the TAs or Professor Runcie for suggestions.

    Morgan, et al. htps://doi.org/10.1038/s41586-018-0828-1

  1. Choose a single experiment from this paper.
  • Many papers report the results of many individual experiments. Choose only one of these.

  • Many papers report on many outcomes from the same experiment (e.g. different response variables). Choose one

  • You should have access to the numeric results of the analysis of the experiment (p-values, F-statistics, confidence intervals, effect estimates), and ideally even the raw data. If results are presented in a figure, you can try to extract these results using a digitization tools like: https://plotdigitizer.com/. You don’t need to do this yet, but may choose to for the final at the end of the quarter.

  • Briefly describe the experiment. Using the terminology of Hurlbert 1984, address:

    • Is this a mensurative or manipulative experiment?

    • What was the experimental objective?

    • How were sources of confusion (Table 1) controlled?

    • What were the results

    • Aim for 1-2 paragraphs. This doesn’t need to be long

    This was a manipulative experiment. This experiment sought to determine the potential biological function of excised stable linear introns in S. cerevisiae by establishing a knockout line of 5 genes that contribute a high amount to the content of excised stable linear introns in saturated growth conditions and comparing their growth and abundance to wild type S. cerevisiae in a competitive growth environment. Experiments were performed in batches and biological replicates, which addresses variability and random error. Control cultures of both the wt and KO strains were grown in the same conditions to both provide a baseline and control for any effects of the treatment itself, as well as time passing. The experiment found that wt strains had a significant advantage, showing a positive fold change in abundance during sustained growth (n = 10, P = 9.4e-05, 95% confidence interval 0.12 to 0.25, two tailed t-test), whereas the the KO had significant advantage during the period that included re-entry to growth and exit from growth, with the wt’s abundance showing a negative fold change in growth (n= 12, P=1e-06, 95% CI -0.74 to -0.46). This indicates that excised stable linear introns can prove beneficial in some physiological contexts and detrimental in others.

  1. Draw a diagram of the experiment.
  • Label the diagram using the terms we discussed in the first class (Treatment, Experimental Unit, Blocks, Response)

  • Try to show the overall structure of how the experiment was laid out.

The goal of this is to get you thinking about the issues in experimental design, and to help me understand the range of questions students are studying.

To upload your diagram, save it as a file (jpeg, png, etc, but not pdf) in the directory of this .Rmd file. Then use the FIGURE/IMAGE button in the toolbar to insert your image.

Here’s an example:

Note: You can use PowerPoint or a drawing tool to create the diagram on your computer, or you can draw on paper, take a picture with your phone, and then download that file into the folder with this HW1.Rmd file, and change the file name above to the file name of your picture. Using the Visual format (click the Visual button on the top-left of this window), click on the image icon to import and image.


2 Part 2 - R practice

In lab, we ran simulations of an experiment to measure the average length of fish in a pond.

Here, you will do a similar exercise except this time we will also simulate an experimental manipulation, (i.e. a treatment) and you will study the treatment’s effect.

We’ll use the example of measuring pulses of people in class with a treatment of sitting vs standing. But this time we’ll “measure” each person’s pulse both sitting and standing.

For the purposes of this simulation, I’ll state that the TRUE values for the relevant population parameters are the following:

  • The average pulse of someone sitting is 70bpm

  • The standard deviation of pulses among sitting people is 10bpm

  • The average effect of standing is 10bpm

  • The standard deviation of standing effects is 3bpm

2.1 Simulate 1 person

Here is the outline of code to simulate the measurements for one person. Fill in the appropriate values by replacing the ___ with numbers.

ave_sitting = 70
sd_sitting = 10
ave_standing_effect = 10
sd_standing_effect = 3

sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
sitting_pulse
[1] 64.31331
standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
standing_pulse = sitting_pulse + standing_effect
standing_pulse
[1] 73.90778
standing_effect
[1] 9.594464

Enter the sitting pulse, standing pulse, and standing effect. Include units.]

Sitting Pulse: 68.78457 bpm

Standing Pulse: 77.82868 bpm

Standing Effect: 9.044107 bpm

As an experimenter, it is impossible to directly observe the effect of standing for this person. All you could observe is sitting_pulse and standing_pulse. Show that you can calculate the standing effect for this person from these two values (replace ___ with R code):

calculated_standing_effect = standing_pulse - sitting_pulse
calculated_standing_effect
[1] 9.594464

Do you get the same value as above?

Yes. But that’s just one person, so I would imagine I would.

2.2 Simulate an experiment involving 40 people

Here is the outline of code to simulate the measurements of standing effects for 40 people. It uses a for loop like in lab. Fill in the calculation needed (replace ___ with code) and run the code. Estimate the average standing effect.

# leave this code here so the simulation is repeatable
set.seed(1)

# start of your code:
n_people = 40
observed_standing_effects = rep(NA,times = n_people)

for(person in 1:n_people) {
  sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
  standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
  standing_pulse = sitting_pulse + standing_effect
  
  calculated_standing_effect = standing_pulse - sitting_pulse #Okay, but I feel like I'm doing this wrong. Isn't this just standing_effect? At least on an individual level.
  observed_standing_effects[person] = calculated_standing_effect
}

average_effect_estimate = mean(observed_standing_effects)
average_effect_estimate
[1] 10.07916

Enter your answer here. Include units

Average effect estimate is 10.07916 BPM

2.3 What is the TRUE error in this estimate?

Use the vector observed_standing_effects above, to calculate how much your estimate missed the true value.

true_error = mean(observed_standing_effects) - ave_standing_effect
true_error
[1] 0.07915764

Enter your answers here. Include units.

True error is 0.07915764 bpm

2.4 Calculate the TRUE standard error based on this experimental design and the TRUE population parameters above

# Enter your code here
true_se = sqrt((sd_standing_effect**2 + var(observed_standing_effects)) / n_people)
true_se
[1] 0.6596864

Enter your answers here. Include units.

True standard error = 0.6596864 bpm

2.5 Simulation 100 replicate experiments with the same size and parameters above, and record the estimated standing effect from each experiment

The following code takes the single experiment with 40 people above, and uses a second for loop to repeat it 100 times. Fill in the code from your answers above to complete so that it estimates the treatment effect for each person, and then calculates the average observed treatment effect.

Calculate the mean and standard deviation of the treatment effect estimates across the 100 experiments. Compare these values to the values that you expect.

set.seed(1)

n_experiments = 100
replicate_estimates = rep(NA,times = n_experiments)

for(expt in 1:100) {
  # code for each individual experiment:
  n_people = 40
  observed_standing_effects = rep(NA,times = n_people)
  
  for(person in 1:n_people) {
    sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
    standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
    standing_pulse = sitting_pulse + standing_effect
    
    calculated_standing_effect = standing_pulse - sitting_pulse
    observed_standing_effects[person] = calculated_standing_effect
  }
  
  # calculate the estimated mean treatment effect for this experiment
  current_experiment_estimate = mean(observed_standing_effects)
  
  # save that estimate in the vector of results
  replicate_estimates[expt] = current_experiment_estimate
}

mean(replicate_estimates)
sd(replicate_estimates)

Enter your answers here. Include units.

Mean treatment effect is 10.03964 bpm Standard deviation is 0.451245 bpm

2.6 Compare to an experiment that measured DIFFERENT PEOPLE for the two treatments

The following code modifies the experimental design to be more similar to what we did in class. We select 40 people to observe sitting, and 40 DIFFERENT people to observe standing. We calculate the average pulses of the people sitting, and the average pulses of the people standing. We then take the difference between these two as our estimate of the standing effect. This full experiment is replicated 100 times so that we can compare it’s efficiency to the previous experiment.

Report the mean and standard deviation of the treatment effect estimates across the 100 experiments. Compare these values to the previous experimental design above

set.seed(1)

n_experiments = 100
replicate_estimates = rep(NA,times = n_experiments)

for(expt in 1:100) {
  # code for each individual experiment:
  
  # first observe 40 people sitting
  n_people = 40
  observed_sitting_pulses = rep(NA,times = n_people)
  
  for(person in 1:n_people) {
    sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
    observed_sitting_pulses[person] = sitting_pulse
  }
  
  # Then observe 40 people standing
  n_people = 40
  observed_standing_pulses = rep(NA,times = n_people)
  
  for(person in 1:n_people) {
    sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
    standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
    standing_pulse = sitting_pulse + standing_effect
    observed_standing_pulses[person] = standing_pulse
  }
  
  # Then calculate the two averages
  average_sitting_pulse = mean(observed_sitting_pulses)
  average_standing_pulse = mean(observed_standing_pulses)
  
  # Then get our estimate of the standing effect
  current_experiment_estimate = average_standing_pulse - average_sitting_pulse
  
  # save that estimate in the vector of results
  replicate_estimates[expt] = current_experiment_estimate
}

mean(replicate_estimates)
sd(replicate_estimates)

Enter your answers here. Include units.

Mean treatment effect is 10.20996 bpm Standard deviation of Treatment Effect is 2.115401 bpm

2.7 Discuss experimental design issues that might impact the VALIDITY of the two designs

Focus on issues that might affect the scientific interpretation of the results.

The first one that comes to mind is in the heterogeneity in the population, especially in the second case. Measuring the standing and sitting pulses of two distinct populations leaves room for biological differences between the two of the groups to influence the results. Furthermore, there were no controls described in the experiment, which for the first would be a replication where the treatment group didn’t stand. This all comes together to make it difficult to definitively quantify the effect of standing on a person’s pulse with any sense of scope, since there exists no established baseline and the second experiment is open to a great deal of error in population differences.

LS0tCnRpdGxlOiAiSFcgMSIKb3V0cHV0OiAKIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KClVzZSB0aGlzIFIgTm90ZWJvb2sgZG9jdW1lbnQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbnMgYW5kIGRvY3VtZW50IHlvdXIgd29yay4KRW50ZXIgdGhlIFIgY29kZSB1c2VkIHRvIGFuc3dlciBlYWNoIHF1ZXN0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIFIgY29kZSBjaHVuay4KV3JpdGUgYW55IHRleHR1YWwgZXhwbGFuYXRpb25zICoqb3V0c2lkZSoqIG9mIHRoZSBjaHVua3MuCkF0dGVtcHQgdG8gY2xlYW4gdXAgeW91ciBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gdGhhdCBvbmx5IHRoZSBuZWNlc3NhcnkgbGluZXMgcmVtYWluLgoKV2hlbiB5b3UgYXJlIGRvbmU6CgoxLiAgU2VsZWN0ICdSdW4gQWxsJyBmcm9tIHRoZSAnUnVuJyBkcm9wZG93biBtZW51LgoyLiAgU2F2ZSAoRmlsZSAtXD4gU2F2ZSkKMy4gIENsaWNrICdQcmV2aWV3JyB0byBicmluZyB1cCB0aGUgYEhXMS5uYi5odG1sYCBmaWxlLiBDaGVjayB0aHJvdWdoIHRoaXMgdG8gbWFrZSBzdXJlIGl0IHJlbmRlcmVkIGNvcnJlY3RseS4KNC4gIFVwbG9hZCB0aGUgZmlsZXM6IGBIVzEubmIuaHRtbGAgYW5kIGBIVzEuUm1kYCB0byBDYW52YXMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgUGFydCAxCgoxLiAgUmVhZCAqKkh1cmxiZXJ0IDE5ODQqKiB1cCB0byB0aGUgc2VjdGlvbiAiSW50ZXJzcGVyc2lvbiBvZiB0cmVhdG1lbnRzIiAuCjIuICBTZWxlY3QgYSBwYXBlciByZXBvcnRpbmcgdGhlIHJlc3VsdHMgb2YgYW4gZXhwZXJpbWVudC4KCi0gICBDaG9vc2UgYSBwYXBlciBmcm9tICoqeW91ciBmaWVsZCoqIHJlcG9ydGluZyBvbiBhbiBleHBlcmltZW50IHJlbGV2YW50IHRvIHlvdXIgb3duIHJlc2VhcmNoLgoKLSAgIEEgZ29vZCBjaG9pY2UgbWlnaHQgYmUgYSByZWNlbnQgcGFwZXIgZnJvbSB5b3VyIG93biBsYWIgKGJ5IHlvdXIgUEkgb3IgcHJldmlvdXMgZ3JhZCBzdHVkZW50cyBvciBwb3N0ZG9jcykgb3IgZnJvbSB5b3VyIG93biByZXNlYXJjaC4KCi0gICBJZiB5b3UgY2Fubm90IGZpbmQgYSBwYXBlciwgY29tZSB0byB0aGUgVEFzIG9yIFByb2Zlc3NvciBSdW5jaWUgZm9yIHN1Z2dlc3Rpb25zLgoKICAgID4gTW9yZ2FuLCBldCBhbC4gaHRwczovL2RvaS5vcmcvMTAuMTAzOC9zNDE1ODYtMDE4LTA4MjgtMQoKMi4gIENob29zZSBhIHNpbmdsZSBleHBlcmltZW50IGZyb20gdGhpcyBwYXBlci4KCi0gICBNYW55IHBhcGVycyByZXBvcnQgdGhlIHJlc3VsdHMgb2YgbWFueSBpbmRpdmlkdWFsIGV4cGVyaW1lbnRzLgogICAgQ2hvb3NlIG9ubHkgb25lIG9mIHRoZXNlLgoKLSAgIE1hbnkgcGFwZXJzIHJlcG9ydCBvbiBtYW55IG91dGNvbWVzIGZyb20gdGhlIHNhbWUgZXhwZXJpbWVudCAoZS5nLiBkaWZmZXJlbnQgcmVzcG9uc2UgdmFyaWFibGVzKS4KICAgIENob29zZSBvbmUKCi0gICBZb3Ugc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBudW1lcmljIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzIG9mIHRoZSBleHBlcmltZW50IChwLXZhbHVlcywgRi1zdGF0aXN0aWNzLCBjb25maWRlbmNlIGludGVydmFscywgZWZmZWN0IGVzdGltYXRlcyksIGFuZCBpZGVhbGx5IGV2ZW4gdGhlIHJhdyBkYXRhLgogICAgSWYgcmVzdWx0cyBhcmUgcHJlc2VudGVkIGluIGEgZmlndXJlLCB5b3UgY2FuIHRyeSB0byBleHRyYWN0IHRoZXNlIHJlc3VsdHMgdXNpbmcgYSBkaWdpdGl6YXRpb24gdG9vbHMgbGlrZTogPGh0dHBzOi8vcGxvdGRpZ2l0aXplci5jb20vPi4KICAgIFlvdSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgeWV0LCBidXQgbWF5IGNob29zZSB0byBmb3IgdGhlIGZpbmFsIGF0IHRoZSBlbmQgb2YgdGhlIHF1YXJ0ZXIuCgotICAgQnJpZWZseSBkZXNjcmliZSB0aGUgZXhwZXJpbWVudC4KICAgIFVzaW5nIHRoZSB0ZXJtaW5vbG9neSBvZiAqKkh1cmxiZXJ0IDE5ODQqKiwgYWRkcmVzczoKCiAgICAtICAgSXMgdGhpcyBhIG1lbnN1cmF0aXZlIG9yIG1hbmlwdWxhdGl2ZSBleHBlcmltZW50PwoKICAgIC0gICBXaGF0IHdhcyB0aGUgZXhwZXJpbWVudGFsIG9iamVjdGl2ZT8KCiAgICAtICAgSG93IHdlcmUgKipzb3VyY2VzIG9mIGNvbmZ1c2lvbiAoVGFibGUgMSkqKiBjb250cm9sbGVkPwoKICAgIC0gICBXaGF0IHdlcmUgdGhlIHJlc3VsdHMKCiAgICAtICAgQWltIGZvciAxLTIgcGFyYWdyYXBocy4KICAgICAgICBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSBsb25nCgogICAgPiBUaGlzIHdhcyBhIG1hbmlwdWxhdGl2ZSBleHBlcmltZW50LgogICAgPiBUaGlzIGV4cGVyaW1lbnQgc291Z2h0IHRvIGRldGVybWluZSB0aGUgcG90ZW50aWFsIGJpb2xvZ2ljYWwgZnVuY3Rpb24gb2YgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgaW4gUy4KICAgID4gY2VyZXZpc2lhZSBieSBlc3RhYmxpc2hpbmcgYSBrbm9ja291dCBsaW5lIG9mIDUgZ2VuZXMgdGhhdCBjb250cmlidXRlIGEgaGlnaCBhbW91bnQgdG8gdGhlIGNvbnRlbnQgb2YgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgaW4gc2F0dXJhdGVkIGdyb3d0aCBjb25kaXRpb25zIGFuZCBjb21wYXJpbmcgdGhlaXIgZ3Jvd3RoIGFuZCBhYnVuZGFuY2UgdG8gd2lsZCB0eXBlIFMuCiAgICA+IGNlcmV2aXNpYWUgaW4gYSBjb21wZXRpdGl2ZSBncm93dGggZW52aXJvbm1lbnQuCiAgICA+IEV4cGVyaW1lbnRzIHdlcmUgcGVyZm9ybWVkIGluIGJhdGNoZXMgYW5kIGJpb2xvZ2ljYWwgcmVwbGljYXRlcywgd2hpY2ggYWRkcmVzc2VzIHZhcmlhYmlsaXR5IGFuZCByYW5kb20gZXJyb3IuCiAgICA+IENvbnRyb2wgY3VsdHVyZXMgb2YgYm90aCB0aGUgd3QgYW5kIEtPIHN0cmFpbnMgd2VyZSBncm93biBpbiB0aGUgc2FtZSBjb25kaXRpb25zIHRvIGJvdGggcHJvdmlkZSBhIGJhc2VsaW5lIGFuZCBjb250cm9sIGZvciBhbnkgZWZmZWN0cyBvZiB0aGUgdHJlYXRtZW50IGl0c2VsZiwgYXMgd2VsbCBhcyB0aW1lIHBhc3NpbmcuCiAgICA+IFRoZSBleHBlcmltZW50IGZvdW5kIHRoYXQgd3Qgc3RyYWlucyBoYWQgYSBzaWduaWZpY2FudCBhZHZhbnRhZ2UsIHNob3dpbmcgYSBwb3NpdGl2ZSBmb2xkIGNoYW5nZSBpbiBhYnVuZGFuY2UgZHVyaW5nIHN1c3RhaW5lZCBncm93dGggKG4gPSAxMCwgUCA9IDkuNGUtMDUsIDk1JSBjb25maWRlbmNlIGludGVydmFsIDAuMTIgdG8gMC4yNSwgdHdvIHRhaWxlZCB0LXRlc3QpLCB3aGVyZWFzIHRoZSB0aGUgS08gaGFkIHNpZ25pZmljYW50IGFkdmFudGFnZSBkdXJpbmcgdGhlIHBlcmlvZCB0aGF0IGluY2x1ZGVkIHJlLWVudHJ5IHRvIGdyb3d0aCBhbmQgZXhpdCBmcm9tIGdyb3d0aCwgd2l0aCB0aGUgd3QncyBhYnVuZGFuY2Ugc2hvd2luZyBhIG5lZ2F0aXZlIGZvbGQgY2hhbmdlIGluIGdyb3d0aCAobj0gMTIsIFA9MWUtMDYsIDk1JSBDSSAtMC43NCB0byAtMC40NikuCiAgICA+IFRoaXMgaW5kaWNhdGVzIHRoYXQgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgY2FuIHByb3ZlIGJlbmVmaWNpYWwgaW4gc29tZSBwaHlzaW9sb2dpY2FsIGNvbnRleHRzIGFuZCBkZXRyaW1lbnRhbCBpbiBvdGhlcnMuCgozLiAgRHJhdyBhIGRpYWdyYW0gb2YgdGhlIGV4cGVyaW1lbnQuCgotICAgTGFiZWwgdGhlIGRpYWdyYW0gdXNpbmcgdGhlIHRlcm1zIHdlIGRpc2N1c3NlZCBpbiB0aGUgZmlyc3QgY2xhc3MgKFRyZWF0bWVudCwgRXhwZXJpbWVudGFsIFVuaXQsIEJsb2NrcywgUmVzcG9uc2UpCgotICAgVHJ5IHRvIHNob3cgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyB0aGUgZXhwZXJpbWVudCB3YXMgbGFpZCBvdXQuCgpUaGUgZ29hbCBvZiB0aGlzIGlzIHRvIGdldCB5b3UgdGhpbmtpbmcgYWJvdXQgdGhlIGlzc3VlcyBpbiBleHBlcmltZW50YWwgZGVzaWduLCBhbmQgdG8gaGVscCBtZSB1bmRlcnN0YW5kIHRoZSByYW5nZSBvZiBxdWVzdGlvbnMgc3R1ZGVudHMgYXJlIHN0dWR5aW5nLgoKVG8gdXBsb2FkIHlvdXIgZGlhZ3JhbSwgc2F2ZSBpdCBhcyBhIGZpbGUgKGpwZWcsIHBuZywgZXRjLCBidXQgbm90IHBkZikgaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGlzIC5SbWQgZmlsZS4KVGhlbiB1c2UgdGhlIEZJR1VSRS9JTUFHRSBidXR0b24gaW4gdGhlIHRvb2xiYXIgdG8gaW5zZXJ0IHlvdXIgaW1hZ2UuCgpIZXJlJ3MgYW4gZXhhbXBsZToKCiFbXShleHBlcmltZW50ZGlhZ3JhbS5ibXApCgoqKk5vdGU6KiogWW91IGNhbiB1c2UgUG93ZXJQb2ludCBvciBhIGRyYXdpbmcgdG9vbCB0byBjcmVhdGUgdGhlIGRpYWdyYW0gb24geW91ciBjb21wdXRlciwgb3IgeW91IGNhbiBkcmF3IG9uIHBhcGVyLCB0YWtlIGEgcGljdHVyZSB3aXRoIHlvdXIgcGhvbmUsIGFuZCB0aGVuIGRvd25sb2FkIHRoYXQgZmlsZSBpbnRvIHRoZSBmb2xkZXIgd2l0aCB0aGlzIEhXMS5SbWQgZmlsZSwgYW5kIGNoYW5nZSB0aGUgZmlsZSBuYW1lIGFib3ZlIHRvIHRoZSBmaWxlIG5hbWUgb2YgeW91ciBwaWN0dXJlLgpVc2luZyB0aGUgKipWaXN1YWwqKiBmb3JtYXQgKGNsaWNrIHRoZSBgVmlzdWFsYCBidXR0b24gb24gdGhlIHRvcC1sZWZ0IG9mIHRoaXMgd2luZG93KSwgY2xpY2sgb24gdGhlIGltYWdlIGljb24gdG8gaW1wb3J0IGFuZCBpbWFnZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBQYXJ0IDIgLSBSIHByYWN0aWNlCgpJbiBsYWIsIHdlIHJhbiBzaW11bGF0aW9ucyBvZiBhbiBleHBlcmltZW50IHRvIG1lYXN1cmUgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIGZpc2ggaW4gYSBwb25kLgoKSGVyZSwgeW91IHdpbGwgZG8gYSBzaW1pbGFyIGV4ZXJjaXNlIGV4Y2VwdCB0aGlzIHRpbWUgd2Ugd2lsbCBhbHNvIHNpbXVsYXRlIGFuICoqZXhwZXJpbWVudGFsIG1hbmlwdWxhdGlvbioqLCAoaS5lLiBhIHRyZWF0bWVudCkgYW5kIHlvdSB3aWxsIHN0dWR5IHRoZSB0cmVhdG1lbnQncyAqKmVmZmVjdCoqLgoKV2UnbGwgdXNlIHRoZSBleGFtcGxlIG9mIG1lYXN1cmluZyBwdWxzZXMgb2YgcGVvcGxlIGluIGNsYXNzIHdpdGggYSB0cmVhdG1lbnQgb2Ygc2l0dGluZyB2cyBzdGFuZGluZy4KQnV0IHRoaXMgdGltZSB3ZSdsbCAibWVhc3VyZSIgZWFjaCBwZXJzb24ncyBwdWxzZSBib3RoIHNpdHRpbmcgYW5kIHN0YW5kaW5nLgoKRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHNpbXVsYXRpb24sIEknbGwgc3RhdGUgdGhhdCB0aGUgVFJVRSB2YWx1ZXMgZm9yIHRoZSByZWxldmFudCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CgotICAgVGhlIGF2ZXJhZ2UgcHVsc2Ugb2Ygc29tZW9uZSBzaXR0aW5nIGlzIDcwYnBtCgotICAgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwdWxzZXMgYW1vbmcgc2l0dGluZyBwZW9wbGUgaXMgMTBicG0KCi0gICBUaGUgYXZlcmFnZSAqKmVmZmVjdCoqIG9mIHN0YW5kaW5nIGlzIDEwYnBtCgotICAgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzdGFuZGluZyBlZmZlY3RzIGlzIDNicG0KCiMjIFNpbXVsYXRlIDEgcGVyc29uCgpIZXJlIGlzIHRoZSBvdXRsaW5lIG9mIGNvZGUgdG8gc2ltdWxhdGUgdGhlIG1lYXN1cmVtZW50cyBmb3Igb25lIHBlcnNvbi4KRmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGJ5IHJlcGxhY2luZyB0aGUgYF9fX2Agd2l0aCBudW1iZXJzLgoKYGBge3J9CmF2ZV9zaXR0aW5nID0gNzAKc2Rfc2l0dGluZyA9IDEwCmF2ZV9zdGFuZGluZ19lZmZlY3QgPSAxMApzZF9zdGFuZGluZ19lZmZlY3QgPSAzCgpzaXR0aW5nX3B1bHNlID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc2l0dGluZywgc2QgPSBzZF9zaXR0aW5nKQpzaXR0aW5nX3B1bHNlCgpzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQpzdGFuZGluZ19wdWxzZSA9IHNpdHRpbmdfcHVsc2UgKyBzdGFuZGluZ19lZmZlY3QKc3RhbmRpbmdfcHVsc2UKc3RhbmRpbmdfZWZmZWN0CmBgYAoKPiBFbnRlciB0aGUgc2l0dGluZyBwdWxzZSwgc3RhbmRpbmcgcHVsc2UsIGFuZCBzdGFuZGluZyBlZmZlY3QuCj4gSW5jbHVkZSB1bml0cy5dCgpTaXR0aW5nIFB1bHNlOiA2OC43ODQ1NyBicG0KClN0YW5kaW5nIFB1bHNlOiA3Ny44Mjg2OCBicG0KClN0YW5kaW5nIEVmZmVjdDogOS4wNDQxMDcgYnBtCgpBcyBhbiBleHBlcmltZW50ZXIsIGl0IGlzIGltcG9zc2libGUgdG8gKipkaXJlY3RseSBvYnNlcnZlKiogdGhlICplZmZlY3Qgb2Ygc3RhbmRpbmcqIGZvciB0aGlzIHBlcnNvbi4KQWxsIHlvdSBjb3VsZCBvYnNlcnZlIGlzIGBzaXR0aW5nX3B1bHNlYCBhbmQgYHN0YW5kaW5nX3B1bHNlYC4KU2hvdyB0aGF0IHlvdSBjYW4gY2FsY3VsYXRlIHRoZSBzdGFuZGluZyBlZmZlY3QgZm9yIHRoaXMgcGVyc29uIGZyb20gdGhlc2UgdHdvIHZhbHVlcyAocmVwbGFjZSBgX19fYCB3aXRoIFIgY29kZSk6CgpgYGB7cn0KY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QgPSBzdGFuZGluZ19wdWxzZSAtIHNpdHRpbmdfcHVsc2UKY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QKYGBgCgo+IERvIHlvdSBnZXQgdGhlIHNhbWUgdmFsdWUgYXMgYWJvdmU/CgpZZXMuCkJ1dCB0aGF0J3MganVzdCBvbmUgcGVyc29uLCBzbyBJIHdvdWxkIGltYWdpbmUgSSB3b3VsZC4KCiMjIFNpbXVsYXRlIGFuIGV4cGVyaW1lbnQgaW52b2x2aW5nIDQwIHBlb3BsZQoKSGVyZSBpcyB0aGUgb3V0bGluZSBvZiBjb2RlIHRvIHNpbXVsYXRlIHRoZSBtZWFzdXJlbWVudHMgb2Ygc3RhbmRpbmcgZWZmZWN0cyBmb3IgNDAgcGVvcGxlLgpJdCB1c2VzIGEgKipmb3IgbG9vcCoqIGxpa2UgaW4gbGFiLgpGaWxsIGluIHRoZSBjYWxjdWxhdGlvbiBuZWVkZWQgKHJlcGxhY2UgYF9fX2Agd2l0aCBjb2RlKSBhbmQgcnVuIHRoZSBjb2RlLgoqKkVzdGltYXRlIHRoZSBhdmVyYWdlIHN0YW5kaW5nIGVmZmVjdC4qKgoKYGBge3J9CiMgbGVhdmUgdGhpcyBjb2RlIGhlcmUgc28gdGhlIHNpbXVsYXRpb24gaXMgcmVwZWF0YWJsZQpzZXQuc2VlZCgxKQoKIyBzdGFydCBvZiB5b3VyIGNvZGU6Cm5fcGVvcGxlID0gNDAKb2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cyA9IHJlcChOQSx0aW1lcyA9IG5fcGVvcGxlKQoKZm9yKHBlcnNvbiBpbiAxOm5fcGVvcGxlKSB7CiAgc2l0dGluZ19wdWxzZSA9IHJub3JtKG49MSxtZWFuID0gYXZlX3NpdHRpbmcsIHNkID0gc2Rfc2l0dGluZykKICBzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQogIHN0YW5kaW5nX3B1bHNlID0gc2l0dGluZ19wdWxzZSArIHN0YW5kaW5nX2VmZmVjdAogIAogIGNhbGN1bGF0ZWRfc3RhbmRpbmdfZWZmZWN0ID0gc3RhbmRpbmdfcHVsc2UgLSBzaXR0aW5nX3B1bHNlICNPa2F5LCBidXQgSSBmZWVsIGxpa2UgSSdtIGRvaW5nIHRoaXMgd3JvbmcuIElzbid0IHRoaXMganVzdCBzdGFuZGluZ19lZmZlY3Q/IEF0IGxlYXN0IG9uIGFuIGluZGl2aWR1YWwgbGV2ZWwuCiAgb2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0c1twZXJzb25dID0gY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QKfQoKYXZlcmFnZV9lZmZlY3RfZXN0aW1hdGUgPSBtZWFuKG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHMpCmF2ZXJhZ2VfZWZmZWN0X2VzdGltYXRlCmBgYAoKPiBFbnRlciB5b3VyIGFuc3dlciBoZXJlLgo+IEluY2x1ZGUgdW5pdHMKCkF2ZXJhZ2UgZWZmZWN0IGVzdGltYXRlIGlzIDEwLjA3OTE2IEJQTQoKIyMgV2hhdCBpcyB0aGUgVFJVRSBlcnJvciBpbiB0aGlzIGVzdGltYXRlPwoKVXNlIHRoZSB2ZWN0b3IgYG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHNgIGFib3ZlLCB0byBjYWxjdWxhdGUgaG93IG11Y2ggeW91ciBlc3RpbWF0ZSBtaXNzZWQgdGhlIHRydWUgdmFsdWUuCgpgYGB7cn0KdHJ1ZV9lcnJvciA9IG1lYW4ob2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cykgLSBhdmVfc3RhbmRpbmdfZWZmZWN0CnRydWVfZXJyb3IKYGBgCgo+IEVudGVyIHlvdXIgYW5zd2VycyBoZXJlLgo+IEluY2x1ZGUgdW5pdHMuCgpUcnVlIGVycm9yIGlzIDAuMDc5MTU3NjQgYnBtCgojIyBDYWxjdWxhdGUgdGhlIFRSVUUgc3RhbmRhcmQgZXJyb3IgYmFzZWQgb24gdGhpcyBleHBlcmltZW50YWwgZGVzaWduIGFuZCB0aGUgVFJVRSBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYWJvdmUKCmBgYHtyfQojIEVudGVyIHlvdXIgY29kZSBoZXJlCnRydWVfc2UgPSBzcXJ0KChzZF9zdGFuZGluZ19lZmZlY3QqKjIgKyB2YXIob2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cykpIC8gbl9wZW9wbGUpCnRydWVfc2UKYGBgCgo+IEVudGVyIHlvdXIgYW5zd2VycyBoZXJlLgo+IEluY2x1ZGUgdW5pdHMuCgpUcnVlIHN0YW5kYXJkIGVycm9yID0gMC42NTk2ODY0IGJwbQoKIyMgU2ltdWxhdGlvbiAxMDAgcmVwbGljYXRlIGV4cGVyaW1lbnRzIHdpdGggdGhlIHNhbWUgc2l6ZSBhbmQgcGFyYW1ldGVycyBhYm92ZSwgYW5kIHJlY29yZCB0aGUgZXN0aW1hdGVkIHN0YW5kaW5nIGVmZmVjdCBmcm9tIGVhY2ggZXhwZXJpbWVudAoKVGhlIGZvbGxvd2luZyBjb2RlIHRha2VzIHRoZSBzaW5nbGUgZXhwZXJpbWVudCB3aXRoIDQwIHBlb3BsZSBhYm92ZSwgYW5kIHVzZXMgYSAqKnNlY29uZCBmb3IgbG9vcCoqIHRvIHJlcGVhdCBpdCAxMDAgdGltZXMuCkZpbGwgaW4gdGhlIGNvZGUgZnJvbSB5b3VyIGFuc3dlcnMgYWJvdmUgdG8gY29tcGxldGUgc28gdGhhdCBpdCBlc3RpbWF0ZXMgdGhlIHRyZWF0bWVudCBlZmZlY3QgZm9yIGVhY2ggcGVyc29uLCBhbmQgdGhlbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9ic2VydmVkIHRyZWF0bWVudCBlZmZlY3QuCgpDYWxjdWxhdGUgdGhlICoqbWVhbioqIGFuZCAqKnN0YW5kYXJkIGRldmlhdGlvbioqIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcyBhY3Jvc3MgdGhlIDEwMCBleHBlcmltZW50cy4KQ29tcGFyZSB0aGVzZSB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHlvdSBleHBlY3QuCgpgYGB7cn0Kc2V0LnNlZWQoMSkKCm5fZXhwZXJpbWVudHMgPSAxMDAKcmVwbGljYXRlX2VzdGltYXRlcyA9IHJlcChOQSx0aW1lcyA9IG5fZXhwZXJpbWVudHMpCgpmb3IoZXhwdCBpbiAxOjEwMCkgewogICMgY29kZSBmb3IgZWFjaCBpbmRpdmlkdWFsIGV4cGVyaW1lbnQ6CiAgbl9wZW9wbGUgPSA0MAogIG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHMgPSByZXAoTkEsdGltZXMgPSBuX3Blb3BsZSkKICAKICBmb3IocGVyc29uIGluIDE6bl9wZW9wbGUpIHsKICAgIHNpdHRpbmdfcHVsc2UgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zaXR0aW5nLCBzZCA9IHNkX3NpdHRpbmcpCiAgICBzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQogICAgc3RhbmRpbmdfcHVsc2UgPSBzaXR0aW5nX3B1bHNlICsgc3RhbmRpbmdfZWZmZWN0CiAgICAKICAgIGNhbGN1bGF0ZWRfc3RhbmRpbmdfZWZmZWN0ID0gc3RhbmRpbmdfcHVsc2UgLSBzaXR0aW5nX3B1bHNlCiAgICBvYnNlcnZlZF9zdGFuZGluZ19lZmZlY3RzW3BlcnNvbl0gPSBjYWxjdWxhdGVkX3N0YW5kaW5nX2VmZmVjdAogIH0KICAKICAjIGNhbGN1bGF0ZSB0aGUgZXN0aW1hdGVkIG1lYW4gdHJlYXRtZW50IGVmZmVjdCBmb3IgdGhpcyBleHBlcmltZW50CiAgY3VycmVudF9leHBlcmltZW50X2VzdGltYXRlID0gbWVhbihvYnNlcnZlZF9zdGFuZGluZ19lZmZlY3RzKQogIAogICMgc2F2ZSB0aGF0IGVzdGltYXRlIGluIHRoZSB2ZWN0b3Igb2YgcmVzdWx0cwogIHJlcGxpY2F0ZV9lc3RpbWF0ZXNbZXhwdF0gPSBjdXJyZW50X2V4cGVyaW1lbnRfZXN0aW1hdGUKfQoKbWVhbihyZXBsaWNhdGVfZXN0aW1hdGVzKQpzZChyZXBsaWNhdGVfZXN0aW1hdGVzKQpgYGAKCj4gRW50ZXIgeW91ciBhbnN3ZXJzIGhlcmUuCj4gSW5jbHVkZSB1bml0cy4KCk1lYW4gdHJlYXRtZW50IGVmZmVjdCBpcyAxMC4wMzk2NCBicG0gU3RhbmRhcmQgZGV2aWF0aW9uIGlzIDAuNDUxMjQ1IGJwbQoKIyMgQ29tcGFyZSB0byBhbiBleHBlcmltZW50IHRoYXQgbWVhc3VyZWQgRElGRkVSRU5UIFBFT1BMRSBmb3IgdGhlIHR3byB0cmVhdG1lbnRzCgpUaGUgZm9sbG93aW5nIGNvZGUgbW9kaWZpZXMgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gdG8gYmUgbW9yZSBzaW1pbGFyIHRvIHdoYXQgd2UgZGlkIGluIGNsYXNzLgpXZSBzZWxlY3QgNDAgcGVvcGxlIHRvIG9ic2VydmUgc2l0dGluZywgYW5kIDQwIERJRkZFUkVOVCBwZW9wbGUgdG8gb2JzZXJ2ZSBzdGFuZGluZy4KV2UgY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHB1bHNlcyBvZiB0aGUgcGVvcGxlIHNpdHRpbmcsIGFuZCB0aGUgYXZlcmFnZSBwdWxzZXMgb2YgdGhlIHBlb3BsZSBzdGFuZGluZy4KV2UgdGhlbiB0YWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgdHdvIGFzIG91ciBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRpbmcgZWZmZWN0LgpUaGlzICoqZnVsbCBleHBlcmltZW50KiogaXMgcmVwbGljYXRlZCAxMDAgdGltZXMgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCdzIGVmZmljaWVuY3kgdG8gdGhlIHByZXZpb3VzIGV4cGVyaW1lbnQuCgpSZXBvcnQgdGhlICoqbWVhbioqIGFuZCAqKnN0YW5kYXJkIGRldmlhdGlvbioqIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcyBhY3Jvc3MgdGhlIDEwMCBleHBlcmltZW50cy4KQ29tcGFyZSB0aGVzZSB2YWx1ZXMgdG8gdGhlIHByZXZpb3VzIGV4cGVyaW1lbnRhbCBkZXNpZ24gYWJvdmUKCmBgYHtyfQpzZXQuc2VlZCgxKQoKbl9leHBlcmltZW50cyA9IDEwMApyZXBsaWNhdGVfZXN0aW1hdGVzID0gcmVwKE5BLHRpbWVzID0gbl9leHBlcmltZW50cykKCmZvcihleHB0IGluIDE6MTAwKSB7CiAgIyBjb2RlIGZvciBlYWNoIGluZGl2aWR1YWwgZXhwZXJpbWVudDoKICAKICAjIGZpcnN0IG9ic2VydmUgNDAgcGVvcGxlIHNpdHRpbmcKICBuX3Blb3BsZSA9IDQwCiAgb2JzZXJ2ZWRfc2l0dGluZ19wdWxzZXMgPSByZXAoTkEsdGltZXMgPSBuX3Blb3BsZSkKICAKICBmb3IocGVyc29uIGluIDE6bl9wZW9wbGUpIHsKICAgIHNpdHRpbmdfcHVsc2UgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zaXR0aW5nLCBzZCA9IHNkX3NpdHRpbmcpCiAgICBvYnNlcnZlZF9zaXR0aW5nX3B1bHNlc1twZXJzb25dID0gc2l0dGluZ19wdWxzZQogIH0KICAKICAjIFRoZW4gb2JzZXJ2ZSA0MCBwZW9wbGUgc3RhbmRpbmcKICBuX3Blb3BsZSA9IDQwCiAgb2JzZXJ2ZWRfc3RhbmRpbmdfcHVsc2VzID0gcmVwKE5BLHRpbWVzID0gbl9wZW9wbGUpCiAgCiAgZm9yKHBlcnNvbiBpbiAxOm5fcGVvcGxlKSB7CiAgICBzaXR0aW5nX3B1bHNlID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc2l0dGluZywgc2QgPSBzZF9zaXR0aW5nKQogICAgc3RhbmRpbmdfZWZmZWN0ID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc3RhbmRpbmdfZWZmZWN0LCBzZCA9IHNkX3N0YW5kaW5nX2VmZmVjdCkKICAgIHN0YW5kaW5nX3B1bHNlID0gc2l0dGluZ19wdWxzZSArIHN0YW5kaW5nX2VmZmVjdAogICAgb2JzZXJ2ZWRfc3RhbmRpbmdfcHVsc2VzW3BlcnNvbl0gPSBzdGFuZGluZ19wdWxzZQogIH0KICAKICAjIFRoZW4gY2FsY3VsYXRlIHRoZSB0d28gYXZlcmFnZXMKICBhdmVyYWdlX3NpdHRpbmdfcHVsc2UgPSBtZWFuKG9ic2VydmVkX3NpdHRpbmdfcHVsc2VzKQogIGF2ZXJhZ2Vfc3RhbmRpbmdfcHVsc2UgPSBtZWFuKG9ic2VydmVkX3N0YW5kaW5nX3B1bHNlcykKICAKICAjIFRoZW4gZ2V0IG91ciBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRpbmcgZWZmZWN0CiAgY3VycmVudF9leHBlcmltZW50X2VzdGltYXRlID0gYXZlcmFnZV9zdGFuZGluZ19wdWxzZSAtIGF2ZXJhZ2Vfc2l0dGluZ19wdWxzZQogIAogICMgc2F2ZSB0aGF0IGVzdGltYXRlIGluIHRoZSB2ZWN0b3Igb2YgcmVzdWx0cwogIHJlcGxpY2F0ZV9lc3RpbWF0ZXNbZXhwdF0gPSBjdXJyZW50X2V4cGVyaW1lbnRfZXN0aW1hdGUKfQoKbWVhbihyZXBsaWNhdGVfZXN0aW1hdGVzKQpzZChyZXBsaWNhdGVfZXN0aW1hdGVzKQpgYGAKCj4gRW50ZXIgeW91ciBhbnN3ZXJzIGhlcmUuCj4gSW5jbHVkZSB1bml0cy4KCk1lYW4gdHJlYXRtZW50IGVmZmVjdCBpcyAxMC4yMDk5NiBicG0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIFRyZWF0bWVudCBFZmZlY3QgaXMgMi4xMTU0MDEgYnBtCgojIyBEaXNjdXNzIGV4cGVyaW1lbnRhbCBkZXNpZ24gaXNzdWVzIHRoYXQgbWlnaHQgaW1wYWN0IHRoZSBWQUxJRElUWSBvZiB0aGUgdHdvIGRlc2lnbnMKCkZvY3VzIG9uIGlzc3VlcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgc2NpZW50aWZpYyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdWx0cy4KCj4gVGhlIGZpcnN0IG9uZSB0aGF0IGNvbWVzIHRvIG1pbmQgaXMgaW4gdGhlIGhldGVyb2dlbmVpdHkgaW4gdGhlIHBvcHVsYXRpb24sIGVzcGVjaWFsbHkgaW4gdGhlIHNlY29uZCBjYXNlLgo+IE1lYXN1cmluZyB0aGUgc3RhbmRpbmcgYW5kIHNpdHRpbmcgcHVsc2VzIG9mIHR3byBkaXN0aW5jdCBwb3B1bGF0aW9ucyBsZWF2ZXMgcm9vbSBmb3IgYmlvbG9naWNhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gb2YgdGhlIGdyb3VwcyB0byBpbmZsdWVuY2UgdGhlIHJlc3VsdHMuCj4gRnVydGhlcm1vcmUsIHRoZXJlIHdlcmUgbm8gY29udHJvbHMgZGVzY3JpYmVkIGluIHRoZSBleHBlcmltZW50LCB3aGljaCBmb3IgdGhlIGZpcnN0IHdvdWxkIGJlIGEgcmVwbGljYXRpb24gd2hlcmUgdGhlIHRyZWF0bWVudCBncm91cCBkaWRuJ3Qgc3RhbmQuCj4gVGhpcyBhbGwgY29tZXMgdG9nZXRoZXIgdG8gbWFrZSBpdCBkaWZmaWN1bHQgdG8gZGVmaW5pdGl2ZWx5IHF1YW50aWZ5IHRoZSBlZmZlY3Qgb2Ygc3RhbmRpbmcgb24gYSBwZXJzb24ncyBwdWxzZSB3aXRoIGFueSBzZW5zZSBvZiBzY29wZSwgc2luY2UgdGhlcmUgZXhpc3RzIG5vIGVzdGFibGlzaGVkIGJhc2VsaW5lIGFuZCB0aGUgc2Vjb25kIGV4cGVyaW1lbnQgaXMgb3BlbiB0byBhIGdyZWF0IGRlYWwgb2YgZXJyb3IgaW4gcG9wdWxhdGlvbiBkaWZmZXJlbmNlcy4K